﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace BpmConnection2Sec
{
    class Config3270
    {

        private InfoUser _user = null;       
        private static Logger logger = Logger.getInstance();

        public Config3270(InfoUser user)
        {
            this._user = user;
        }
        public Config3270(string userName)
        {            
            this._user = new InfoUser(userName, true);
        }

        public Config3270()
        {
        }

        public Int16 make3270Configuration()
        {
            try
            {
                if (!File.Exists(Make3270CfgFile.LCK_3270_FILE_NAME))
                {
                    //lo creo se non esiste o se esiste e lo si vuole ricreare
                    logger.log("Starting file creation...", "STD");
                    new Make3270CfgFile(_user).config3270File();
                    //calcolo del lock file (abilitazione al return code per l'errore o meno)
                    return this.flushLock();
                }
                else
                {
                    //Siamo già passati almeno una volta nella configurazione
                    //ATTENZIONE! La nuova versione (LK - 15.04.2011) deve entrare 
                    //nel merito del contenuto del file di lock per capire se è 
                    //tutto coerente o devo ricreare qualcosa.                   
                    logger.log("The lock file exists, Configuration already done!", "STD");
                    Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));
                    Console.WriteLine("Calcolo già effettuato");
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            return 0;
        }

        public Dictionary<string, bool> needAnotherLoad() 
        {
            Dictionary<string, bool> _needAnotherLoad = new Dictionary<string, bool>();
            Dictionary<string, string> ila = loadLockFile();           
            //carico le info utente per capirne la coerenza
            //devo prenderle da AD.            
            string rcOuFromAD = this._user.getOuFromAd();
            bool isUpdateForOuNecessary = true;
            bool isUpdateForScNecessary = true;
            bool isUsrScLogon = this._user.isUserAuthenticatedWithSmartCard();
            if (ila.Count != 0) {
                isUpdateForOuNecessary = !rcOuFromAD.Equals(ila["OU"]);
                isUpdateForScNecessary = !isUsrScLogon.ToString().Equals(ila["LASTSCLOGON"]);
            }
            _needAnotherLoad.Add("NEEDUPDATE", (isUpdateForOuNecessary || isUpdateForScNecessary));

            if (isUpdateForOuNecessary || isUpdateForScNecessary)
            {
                _needAnotherLoad.Add("OU", isUpdateForOuNecessary);
                _needAnotherLoad.Add("LOGONTYPE", isUpdateForScNecessary); //True con SC, False senza
            }
           
            return _needAnotherLoad;
        }
        private Dictionary<string, string> loadLockFile()
        {
           Dictionary<string, string> infoLastAccess = new Dictionary<string, string>();
           try {            
               using (StreamReader sr = new StreamReader(Make3270CfgFile.LCK_3270_FILE_NAME)) 
                {
                    String line;
                    // Read and display lines from the file until the end of 
                    // the file is reached.                    
                    while (((line = sr.ReadLine()) != null))
                    {
                       //logger.log(line, "STD"); 
                       //taglio appositamnet eper le inof di OU e SC last access
                        if (line.Contains("="))
                        {
                            string[] keyandValue = line.Split('=');
                            infoLastAccess.Add(keyandValue[0], keyandValue[1]);
                        }
                    }
                }
            }
            catch (Exception e) 
            {
                //se ho un'eccezione, ragiono come se il file non ci fosse e ricreo tutto.
                logger.log("Eccezione nel leggere il file di lock:"+e.Message, "ERR");
            }
            return infoLastAccess;
        }

        public Int16 flushLock()
        {
            using (FileStream fs = new FileStream(Make3270CfgFile.LCK_3270_FILE_NAME, FileMode.Create, FileAccess.Write, FileShare.None))
            using (StreamWriter w = new StreamWriter(fs))
            {
                w.WriteLine("LASTSCLOGON=" + this._user.isUserAuthenticatedWithSmartCard());
                w.WriteLine("OU="+this._user.getOuFromAd());                
                w.Close();
            }
            return 0;
        }
    }
}
